#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <errno.h>

#include <sys/socket.h>

#include <arpa/inet.h>

#include <netinet/in.h>

#include <sys/types.h>

#include <unistd.h>



#define BUFLEN 100



int main(int argc, char **argv)

{

    int sockfd;

    struct sockaddr_in s_addr;

    socklen_t len;

    unsigned int port;

    char buf[BUFLEN];



    /*建立socket*/

    if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1){

        perror("socket");

        exit(errno);

    }else

        printf("socket create success!\n");



    /*设置服务器端口*/

    if(argv[2])

        port = atoi(argv[2]);

    else

        port = 1234;

    /*设置服务器ip*/

    bzero(&s_addr, sizeof(s_addr));

    s_addr.sin_family = AF_INET;

    s_addr.sin_port = htons(port);

    if (inet_aton(argv[1], (struct in_addr *)&s_addr.sin_addr.s_addr) == 0) {

        perror(argv[1]);

        exit(errno);

    }

    /*开始连接服务器*/

    if(connect(sockfd,(struct sockaddr*)&s_addr,sizeof(struct sockaddr)) == -1){

        perror("connect");

        exit(errno);

    }else

        printf("conncet success!\n");



    while(1){

        /******接收消息*******/

        bzero(buf,BUFLEN);

        len = recv(sockfd,buf,BUFLEN,0);

        if(len > 0)

            printf("服务器发来的消息是：%s,共有字节数是: %d\n",buf,len);

        else{

            if(len < 0 )

                printf("接受消息失败！\n");

            else

                printf("服务器退出了，聊天终止！\n");

            break;

        }

    _retry:

        /******发送消息*******/

        bzero(buf,BUFLEN);

        printf("请输入发送给对方的消息：");

        /*fgets函数：从流中读取BUFLEN-1个字符*/

        fgets(buf,BUFLEN,stdin);

        /*打印发送的消息*/

        //fputs(buf,stdout);

        if(!strncasecmp(buf,"quit",4)){

            printf("client 请求终止聊天!\n");

            break;

        }

        /*如果输入的字符串只有"\n"，即回车，那么请重新输入*/

        if(!strncmp(buf,"\n",1)){

            printf("输入的字符只有回车，这个是不正确的！！！\n");

            goto _retry;

        }

        /*如果buf中含有'\n'，那么要用strlen(buf)-1，去掉'\n'*/

        if(strchr(buf,'\n'))

            len = send(sockfd,buf,strlen(buf)-1,0);

        /*如果buf中没有'\n'，则用buf的真正长度strlen(buf)*/

        else

            len = send(sockfd,buf,strlen(buf),0);

        if(len > 0)

            printf("消息发送成功，本次共发送的字节数是：%d\n",len);

        else{

            printf("消息发送失败!\n");

            break;

        }

    }

    /*关闭连接*/

    close(sockfd);



    return 0;

}
